[劍指 offer]--鏈表--面試題25. 合併兩個排序的鏈表

1 題目描述

輸入兩個遞增排序的鏈表,合併這兩個鏈表並使新鏈表中的節點仍然是遞增排序的。

示例1:

輸入:1->2->4, 1->3->4
輸出:1->1->2->3->4->4
限制:

0 <= 鏈表長度 <= 1000

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

2 解題思路

  • 方法:雙指針+僞節點
    根據題目描述, 鏈表 l1, l2 是 遞增 的,因此容易想到使用雙指針 l1 和 l2遍歷兩鏈表,根據 l1 .val 和 l2 .val 的大小關係確定節點添加順序,兩節點指針交替前進,直至遍歷完畢。

引入僞頭節點: 由於初始狀態合併鏈表中無節點,因此循環第一輪時無法將節點添加到合併鏈表中。解決方案:初始化一個輔助節點 dum 作爲合併鏈表的僞頭節點,將各節點添加至 dum 之後。

在這裏插入圖片描述
在這裏插入圖片描述

作者:jyd
鏈接:https://leetcode-cn.com/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/solution/mian-shi-ti-25-he-bing-liang-ge-pai-xu-de-lian-b-2/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

3 解決代碼

  • 方法:雙指針+僞節點《Java代碼》
/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        // ListNode dum = new ListNode(0);
        // ListNode cur = dum;
        ListNode dum = new ListNode(0), cur = dum;
        while(l1 != null && l2 != null){
            if(l1.val < l2.val){
                cur.next = l1;
                l1 = l1.next;
            }  
            else{
                cur.next = l2;
                l2 = l2.next;
            }
            cur = cur.next;
        }
        //如果l1不爲空返回l1,否則返回l2
        cur.next = l1 != null ?l1:l2;
        return dum.next;
    }
}
  • 方法:雙指針+僞節點《python3 代碼》
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode:
        cur = dum = ListNode(0)
        while l1 and l2:
            if l1.val < l2.val:
                cur.next = l1
                l1 = l1.next
            else:
                cur.next = l2
                l2 = l2.next
            cur = cur.next
        if not l1:
            cur.next = l2
        else:
            cur.next = l1
        #cur.next = l1 if l1 else l2
        return dum.next
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章