本题目是意思是把两个有序的链表合成一个有序的链表,考察了归并算法和链表的操作。
代码也相对比较简单,简单说一下归并函数里三个指针的作用,sum是返回的第一个指针,cur是所要返回的链表里走到的位置,put是对于取到的l1或l2里的某一个指针节点。全部的可运行代码如下:
#include<stdio.h> #include<string.h> #include<stdlib.h> struct ListNode{ int value; ListNode *next; }; ListNode *mergeTwoList(ListNode *l1,ListNode *l2) { ListNode *sum; ListNode *cur; ListNode *put; sum=NULL;//will be returned if((l1==NULL)||(l2==NULL)) return l1?l1:l2; while(l1&&l2) { if(l1->value<l2->value) { put=l1; l1=l1->next; } else { put=l2; l2=l2->next; } if(sum==NULL) { sum=put; cur=sum; } else { cur->next=put; cur=cur->next; } } if(l1) cur->next=l1; if(l2) cur->next=l2; return sum; } int main() { int n,m; printf("Please input the first list number:"); while(scanf("%d",&m)!=EOF) { ListNode *h1=(ListNode*)malloc(sizeof(ListNode)); ListNode *p1=h1; p1->next=NULL; printf("Please input the first list:\n"); int tmp,i; scanf("%d",&tmp); p1->value=tmp; for(i=0;i<m-1;i++) { scanf("%d",&tmp); ListNode *q1=(ListNode*)malloc(sizeof(ListNode)); q1->value=tmp; p1->next=q1; p1=q1; p1->next=NULL; } printf("Please input the second list number:"); scanf("%d",&n); printf("Please input the second list:\n"); ListNode *h2=(ListNode*)malloc(sizeof(ListNode)); ListNode *p2=h2; p2->next=NULL; scanf("%d",&tmp); p2->value=tmp; for(i=0;i<n-1;i++) { scanf("%d",&tmp); ListNode *q2=(ListNode*)malloc(sizeof(ListNode)); q2->value=tmp; p2->next=q2; p2=q2; p2->next=NULL; } printf("After Merge:"); ListNode *list=mergeTwoList(h1,h2); ListNode *p=list; while(p) { printf("%d ",p->value); p=p->next; } free(h1); free(h2); printf("\n"); printf("Please input the first list number:"); } return 0; }
时间: 2024-11-07 14:28:16