leetcode 21 Merge Two Sorted Lists
Merge two sorted linked lists and return it as a new list. The new list should be made by splicing together the nodes of the first two lists.
我的解决方案:
/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */ class Solution { public: ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) { if(NULL==l1) return l2; if(NULL==l2) return l1; ListNode* head = NULL; if(l1->val < l2->val) { head = l1; l1 = l1->next; } else { head = l2; l2 = l2->next; } ListNode* p = head; // pointer to form new list while(l1!=NULL&&l2!=NULL) { if(l1->val < l2->val) { p->next = l1; l1 = l1 ->next; } else { p->next = l2; l2 = l2 ->next; } p = p->next; } if(l1) { p->next = l1; } else { p->next = l2; } return head; } };
递归c++解法:
class Solution { public: ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) { if(l1 == NULL) return l2; if(l2 == NULL) return l1; if(l1->val < l2->val) { l1->next = mergeTwoLists(l1->next, l2); return l1; } else { l2->next = mergeTwoLists(l2->next, l1); return l2; } } };
python递归解决方案:
def mergeTwoLists(self, l1, l2): if not l1: return l2 elif not l2: return l1 else: if l1.val <= l2.val: l1.next = self.mergeTwoLists(l1.next, l2) return l1 else: l2.next = self.mergeTwoLists(l1, l2.next) return l2
python非递归:
# Definition for singly-linked list. # class ListNode: # def __init__(self, x): # self.val = x # self.next = None class Solution: # @param {ListNode} l1 # @param {ListNode} l2 # @return {ListNode} def mergeTwoLists(self, l1, l2): p1 = l1 p2 = l2 guard = ListNode(0) q = guard while p1 is not None and p2 is not None: if p1.val <= p2.val: q.next = p1 p1 = p1.next q = q.next else: q.next = p2 p2 = p2.next q = q.next if p1 is not None: q.next = p1 if p2 is not None: q.next = p2 return guard.next
python递归解决方案2:
If both lists are non-empty, I first make sure a starts smaller, use its head as result, and merge the remainders behind it. Otherwise, i.e., if one or both are empty, I just return what's there. class Solution: def mergeTwoLists(self, a, b): if a and b: if a.val > b.val: a, b = b, a a.next = self.mergeTwoLists(a.next, b) return a or b