合并两个有序链表: 如: [1, 2, 4] [1, 3, 4] 合并之后为[1, 1, 2, 3, 4, 4]
typedef struct node
{
int val
;
struct node
*next
;
}ListNode
;
ListNode
*merge2Lists(ListNode
*p1
, ListNode
*p2
)
{
ListNode
*pre
= new ListNode(-1);
ListNode
*newlist
= pre
;
while( p1
!=NULL && p2
!=NULL )
{
if( p1
->val
<= p2
->val
)
{
pre
->next
= p1
;
p1
= p1
->next
;
}
else
{
pre
->next
= p2
;
p2
= p2
->next
;
}
pre
= pre
->next
;
}
pre
->next
= p1
!=NULL?p1
:p2
;
return newlist
->next
;
}
合并 K 个有序链表: 如: [ [NULL], [-1,0,2,6],[3,6],[NULL] ] 合并之后为: [ -1, 0, 2, 3, 6, 6 ]
struct ListNode
{
int val
;
struct ListNode
*next
;
};
struct ListNode
*mergeTwoLists(struct ListNode
*l1
, struct ListNode
*l2
)
{
if(NULL==l1
&& NULL==l2
)
return NULL;
else if(NULL==l1
)
return l2
;
else if(NULL==l2
)
return l1
;
struct ListNode
*pre
= (struct ListNode
*)malloc(sizeof(struct ListNode
));
struct ListNode
*head
= pre
;
while( l1
!=NULL && l2
!=NULL )
{
if(l1
->val
<= l2
->val
)
{
pre
->next
= l1
;
l1
= l1
->next
;
}
else{
pre
->next
= l2
;
l2
= l2
->next
;
}
pre
= pre
->next
;
}
pre
->next
= l1
!=NULL?l1
:l2
;
return head
->next
;
}
struct ListNode
*mergeKLists(struct ListNode
**lists
, int listsSize
)
{
if(listsSize
<=0)
return NULL;
if( 1==listsSize
)
return lists
[0];
int i
, interval
=1;
while( interval
< listsSize
)
{
for( i
=0; i
+interval
<listsSize
; i
+=2*interval
)
{
lists
[i
] = mergeTwoLists(lists
[i
], lists
[i
+interval
]);
}
interval
*= 2;
}
return lists
[0];
}