天天看點

劍指Offer25 合并兩個排序的連結清單劍指Offer 25. 合并兩個排序的連結清單

劍指Offer 25. 合并兩個排序的連結清單

劍指Offer 25. 合并兩個排序的連結清單

這題是一道簡單題,如果學習了資料結構當中的連結清單的話,可以很輕松就想出解題過程:

/**
 * 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 newhead=new ListNode(1);
        ListNode temNode = newhead;
        ListNode temNode1 = l1;
        ListNode temNode2 = l2;
        while (temNode1!=null && temNode2!=null) {
            if (temNode1.val<=temNode2.val) {
                temNode.next=new ListNode(temNode1.val);
                temNode1=temNode1.next;
            }
            else {
                temNode.next=new ListNode(temNode2.val);
                temNode2=temNode2.next;
            }
            temNode = temNode.next;
        }
        if (temNode1!=null || temNode2!=null) {
            ListNode newNode = temNode1==null ? temNode2:temNode1;
            while (newNode!=null) {
                temNode.next = new ListNode(newNode.val);
                newNode = newNode.next;
                temNode = temNode.next;
            }
        }
        return newhead.next;
    }
}
           

先建立兩個節點newhead和temnode作為我們要傳回連結清單的頭節點和替身,再建立兩個節點temNode1和temNode2來代替l1和l2。當temNode1和temNode2都不為null時,也就是兩個連結清單都沒有周遊完,然後根據temNode1和temNode2的值來決定将誰的值作為新加在temNode後的節點的值。當temNode1或temNode2中有一個為null,即短的那一個連結清單周遊完了,我們需要周遊較長的連結清單的剩餘部分。

寫完後,經過簡單的調試,送出通過。

看了看代碼,發現代碼中還有待改善的地方:

  • 可以不使用temNode1和temNode2來代替l1和l12
  • temNode.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:
        newhead = ListNode()
        head = newhead
        while l1!=None and l2!=None:
            if l1.val<=l2.val:
                newhead.next = l1
                l1 = l1.next
            else:
                newhead.next = l2
                l2 = l2.next
            newhead = newhead.next
        if l1!=None or l2!=None:
            newNode = l2 if l1 == None else l1
            while newNode != None:
                newhead.next = newNode
                newhead = newhead.next
                newNode = newNode.next

        return head.next