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.
Example:
Input: 1->2->4, 1->3->4
Output: 1->1->2->3->4->4
题解:
合并两个已排序的链表:
思路是创建一个头结点ListNode result(0),让new_head指向这个头结点;然后比较两个链表,将较小的节点插入到new_head后右移该节点的指针和new_head指针,直到两个链表有一个为空指针;连接剩余的非空的链表;最后返回result.next。
My Solution(C/C++完整实现):
#include <stdio.h>
#include <iostream>
using namespace std;
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
class Solution {
public:
ListNode * Merge(ListNode* pHead1, ListNode* pHead2)
{
ListNode result(0);
ListNode *new_head = &result;
while (pHead1 && pHead2) {
if (pHead1->val < pHead2->val) {
new_head->next = pHead1;
pHead1 = pHead1->next;
}
else {
new_head->next = pHead2;
pHead2 = pHead2->next;
}
new_head = new_head->next;
}
if (pHead1) {
new_head->next = pHead1;
}
if (pHead2) {
new_head->next = pHead2;
}
return result.next;
}
};
int main() {
ListNode a(1);
ListNode b(2);
ListNode c(4);
ListNode d(5);
ListNode e(7);
ListNode A(3);
ListNode B(5);
ListNode C(6);
ListNode D(8);
ListNode E(10);
a.next = &b;
b.next = &c;
c.next = &d;
d.next = &e;
A.next = &B;
B.next = &C;
C.next = &D;
D.next = &E;
Solution s;
ListNode *result = s.Merge(&a, &A);
while (result) {
printf("%d->", result->val);
result = result->next;
}
return 0;
}
结果:
1->2->3->4->5->5->6->7->8->10->
My Solution(Python):
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def mergeTwoLists(self, l1, l2):
"""
:type l1: ListNode
:type l2: ListNode
:rtype: ListNode
"""
new_head = ListNode(0)
result = new_head
while l1 and l2:
if l1.val <= l2.val:
new_head.next = l1
l1 = l1.next
else:
new_head.next = l2
l2 = l2.next
new_head = new_head.next
if l1:
new_head.next = l1
if l2:
new_head.next = l2
return result.next
网友评论