题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
输入
{1,3,5},{2,4,6}返回值
{1,2,3,4,5,6}
这道题的难度是简单,思路还是很简单的,大二学刚开始学数据结构的时候老师就讲过链表的合并。
思路:
(1)创建一个新链表list3;
(2)比较两个有序链表list1和list2的首个节点元素的大小,小的放入新链表,如果相等的话放哪个都行。(比如上面的示例放入list1);
(3)然后放入新链表的链表指针后移,继续比较list1和list2两个指针所指向元素的大小,小的继续放入到新链表;
(4)重复步骤3,直到其中的一个有序链表为空,然后将剩余不为空的有序链表插入到新链表中;
(5)合并完成。
C/C++版代码:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/**
*
* @param pHead1 ListNode类
* @param pHead2 ListNode类
* @return ListNode类
*/
struct ListNode* Merge(struct ListNode* pHead1, struct ListNode* pHead2 ) {
// write code here
if(pHead1==NULL){
return pHead2;
}
if(pHead2==NULL){
return pHead1;
}
struct ListNode* Head;
struct ListNode* p;
if(pHead1->val <= pHead2->val)
{
Head = pHead1;
pHead1 = pHead1->next;
}
else
{
Head = pHead2;
pHead2 = pHead2->next;
}
p = Head;
while(pHead1!=NULL && pHead2!=NULL){
if(pHead1->val <= pHead2->val) {
p->next = pHead1;
pHead1 = pHead1->next;
} else {
p->next = pHead2;
pHead2 = pHead2->next;
}
p = p->next;
}
if(pHead1==NULL) {
p->next = pHead2;
}
if(pHead2==NULL)
{
p->next = pHead1;
}
return Head;
}
Java版代码:
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}*/
public class Solution {
public ListNode Merge(ListNode list1,ListNode list2) {
if (list1 == null) {
return list2;
}
if (list2 == null) {
return list1;
}
ListNode list3 = null;
ListNode p = null;
if (list1.val <= list2.val)
{
list3 = p = list1;
list1 = list1.next;
}
else {
list3 = p = list2;
list2 = list2.next;
}
while(list1 != null && list2 != null) {
if(list1.val <= list2.val) {
p.next = list1;
p = p.next;
list1 = list1.next;
} else {
p.next = list2;
p = p.next;
list2 = list2.next;
}
}
if(list1 == null) {
p.next = list2;
}
if(list2 == null) {
p.next = list1;
}
return list3;
}
}