LeetCode之兩有序列表合併

LeetCode之兩有序列表合併

自己卡在某個死角

問題

ListNode head=null;
head=l1;
l1=l1.next;
head=head.next;

以上代碼 導致 我最好拿到head是鏈表的末尾,而鏈表又是單鏈表,不能逆轉

解決方案

new一個空的head,然後操作head的next

 public ListNode headMergeTwoLists(ListNode l1, ListNode l2) {
        ListNode dump = new ListNode(0);
        ListNode cur = dump;
        while(l1 != null || l2 != null) {
            if(l1 == null) {
                cur.next = l2;
                l2 = l2.next;
            }else if (l2 == null) {
                cur.next = l1;
                l1 = l1.next;
            }else if(l1.val < l2.val){
                cur.next = l1;
                l1 = l1.next;
            }else{
                cur.next = l2;
                l2 = l2.next;
            }
            cur = cur.next;
        }
        return dump.next;
    }
  1. 總結
    第一輪的時候,cur持有的是dump引用,然後對cur.next賦值 ,其實就是對dump.next賦值,然後通過cur這邊變量作爲中轉,將l1,l2鏈表搬移到 dump鏈上面

遞歸

  1. 代碼
    public ListNode recursionMergeTwoLists(ListNode l1, ListNode l2) {
        if (l1 == null) {
            return l2;
        }
        if (l2 == null) {
            return l1;
        }
        ListNode header = null;
        if (l1.val <= l2.val) {
            header = l1;
            header.next = recursionMergeTwoLists(l1.next, l2);
        } else {
            header = l2;
            header.next = recursionMergeTwoLists(l1, l2.next);
        }
        return header;
    }
  1. 總結:
    1. 怎麼遞歸能形成鏈表
      分析遞歸過程:
      1. new 一個鏈表對象
      2. 賦值
      3. 遞歸給鏈表 next對象賦值
      這樣鏈表就形成,每次遞歸的時候,都是在給上一個鏈表節點next賦值(鏈表頭例外),然後遞歸的給自己節點next賦值
    2. 爲什麼返回鏈表的頭
      1. 遞歸的時候,是從最底層開發返回,要返回到最外層,所以返回的是最外的header對象,最外層的header對象就是鏈表頭
      總結下:說白就是用遞歸的返回的特性,實現單項列表,正向的遍歷後,逆向返回過程
    3. 盜用一張別人圖,分析過程
      在這裏插入圖片描述
  2. 借鑑博客: CSDN

不得不吐槽下自己

以上方案都是百度到,而不是自己想到的,這麼簡單的題目,卡了很久,不得不反省下自己

代碼地址:

gitee

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章