LeetCode-021合并两个有序链表(Merge Two Sorted Lists)

LeetCode-021

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


Solution

Java
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
class Solution {
public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
ListNode solution=new ListNode(-1);
solution.next=l1;
ListNode node;
ListNode sol=solution;
while (l2!=null) { //l2 -> l1
if (solution.next==null) {
solution.next=l2;
break;
}
if (l2.val>solution.next.val)
solution=solution.next;
else {
node=solution.next;
solution.next=new ListNode(l2.val);
solution.next.next=node;
l2=l2.next;
}
}
return sol.next;
}
}
C
#orderList.h
struct ListNode {
int val;
struct ListNode *next;
};

int comp(int a,int b);
void initList(struct ListNode **L);
void printList(struct ListNode *L);
void orderInsert(struct ListNode *L,int e,int(*compare)(int a,int b));

void insertElement(struct ListNode** L);
void initOrderlist(struct ListNode** L);

struct ListNode* mergeTwoLists(struct ListNode** l1, struct ListNode* l2);

#orderList.c
#include "stdio.h"
#include "stdlib.h"
#include "orderList.h"

/**
* a>b:return > 0
* a=b:return = 0
* a<b:return < 0
* Do not use **, return a pointer is better.
*/
int comp(int a,int b){
return a-b;
}

int (*compare)(int a,int b) = &comp;

void printList(struct ListNode* L){
struct ListNode* p=L;
printf("当前链表为:\n");
while (p->next!=NULL){
p=p->next;
printf("%d ",p->val);
}
printf("\n");
}

void initList(struct ListNode **L){
printf("初始化链表:\n");
struct ListNode* p=(struct ListNode*)malloc(sizeof(struct ListNode));//Head
(*L)=p;p->val=-1;p->next=NULL;
int index=1;
int val=-1;
while(1) {
printf("退出请输入-1,请输入结点%d:\n",index);
scanf("%d",&val);
if (val==-1) break;
p->next=(struct ListNode*)malloc(sizeof(struct ListNode));//Head
p->next->val=val;p->next->next=NULL;
p=p->next;
index++;
}
printList(*L);
}

void orderInsert(struct ListNode *L,int e,int(*compare)(int a,int b)){
struct ListNode* p=L;
struct ListNode* q=(struct ListNode*)malloc(sizeof(struct ListNode));
q->val=e;q->next=NULL;
while (1){
if (p->next==NULL){
p->next=q;
break;
}
if ((*compare)(p->next->val,e)<0)
p=p->next;
else{
q->next=p->next;
p->next=q;
break;
}
}
}

void insertElement(struct ListNode** L){
printf("在链表中插入结点:\n");
int val=-1;
while (1){
printf("退出请输入-1,请输入插入结点:\n");
scanf("%d",&val);
if (val==-1) break;
orderInsert(*L,val,compare);
}
printList(*L);
}

void initOrderlist(struct ListNode** L){
(*L)=(struct ListNode*)malloc(sizeof(struct ListNode));
(*L)->val=-1;(*L)->next=NULL;
printf("初始化有序链表:\n");
int index=1;
int val=-1;
while (1){
printf("退出请输入-1,请输入结点%d:\n",index);
scanf("%d",&val);
if (val==-1) break;
orderInsert(*L,val,compare);
index++;
}
printList(*L);
}

struct ListNode* mergeTwoLists(struct ListNode** l1, struct ListNode* l2){
while (l2->next!=NULL){
l2=l2->next;
int val=l2->val;
orderInsert(*l1,val,compare);
}
return *l1;
}

#main.c
#include "orderList.h"
int main(int argc,char* argv[]){
int op;
struct ListNode *head1;
struct ListNode *head2;
printf("请选择操作类型:1、构建有序表;2、构建并向有序表中插入元素;3、构建两个有序表并将其合并为同一个;4、退出:\n");
scanf("%d",&op);
switch (op){
case 1:{
initOrderlist(&head1);
break;
}
case 2:{
initOrderlist(&head1);
insertElement(&head1);
break;
}
case 3:{
initOrderlist(&head1);
initOrderlist(&head2);
printList(mergeTwoLists(&head1,head2));
break;
}
case 4:
exit(0);
}
return 0;
}

题目描述:
将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

总结:

执行用时2 ms,在所有 Java 提交中击败了95.30%的用户。
内存消耗36.3 MB,在所有 Java 提交中击败了87.29%的用户。

很简单的程序,后面补充递归算法,分别用Java和C实现。

记:
已经写过1,2,3,7,9,13,14,20,21,706十道,在写 Top-100-liked-questions ,账户页面 https://leetcode-cn.com/u/v2beach/ ,尝试在csdn记录,会努力找到每个题的最优解,欢迎互勉和监督。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×