题目:
合并两个排序链表,将两个排序链表合并为一个新的排序链表。
样例:
给出 1->3->8->11->15->null
,2->null
, 返回1->2->3->8->11->15->null
。
思路:
由于两个链表是有序链表,所以只需通过移动l1和l2,来比较l1和l2的数值大小即可。可以新建一个链表,将两个链表中的元素按从小到大的顺序一个一个插入新建的链表中,即如果l1的数值小于l2的数值,就把l1的数值赋值给新链表,如果l2的数值小于l1的数值,就把l2的数值赋值给新链表。
/**
* Definition of ListNode
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param ListNode l1 is the head of the linked list
* @param ListNode l2 is the head of the linked list
* @return: ListNode head of linked list
*/
ListNode *mergeTwoLists(ListNode *l1, ListNode *l2) {
// write your code here
ListNode *dummy=new ListNode;
ListNode *head=dummy;
ListNode *node;
if(l1==NULL) return l2;
else if(l2==NULL) return l1;
else { while(l1!=NULL&&l2!=NULL){
ListNode *p=new ListNode;
if(l1->val<l2->val){
dummy->val=l1->val;
l1=l1->next;
node=dummy;
dummy->next=p;
dummy=dummy->next;
}
else if(l2->val<=l1->val){
dummy->val=l2->val;
l2=l2->next;
node=dummy;
dummy->next=p;
dummy=dummy->next;
}
}
if(l1==NULL){
node->next=l2;
}
else if(l2==NULL){
node->next=l1;
}
return head;
}
}
};
感想:
如果不新建链表,只靠通过改变l1->next与l2->next的指向来合并两个链表,则做起来比较复杂。所以这种合并的问题可以通过新建链表来完成,这样不仅条理清晰,而且大大改变了程序的繁琐问题。