1
+ class compare
2
+ {
3
+ public:
4
+ bool operator ()(ListNode *l1,ListNode *l2){
5
+ // if(!l1 || !l2)
6
+ // return !l1;
7
+
8
+ if (l1 == NULL )return 1 ;
9
+ if (l2 == NULL )return 0 ;
10
+ return l1->val > l2->val ;
11
+ // 这里比较的是优先级,默认优先级排序是“<”号,若 l1Val > l2Val 返回真,即表示l1优先级比l2小,l2先入队
12
+ // 队列的top()函数指的就是优先级最高的元素,即队头元素
13
+ }
14
+ };
15
+
16
+ class Solution {
17
+ public:
18
+ ListNode* mergeKLists (vector<ListNode*>& lists) {
19
+ int len = lists.size ();
20
+ if (len == 0 )return NULL ;
21
+
22
+ priority_queue<ListNode*,vector<ListNode*>,compare> Q;// 调用小顶堆的方法构造队列!!!
23
+
24
+ for (int i = 0 ;i < len;i++)
25
+ {
26
+ if (lists[i])Q.push (lists[i]);
27
+ }
28
+
29
+ ListNode *head = new ListNode (0 );
30
+ ListNode *tail = head;
31
+ while (!Q.empty () && Q.top () != NULL )
32
+ {
33
+ ListNode *tmp = Q.top ();
34
+ Q.pop ();
35
+ tail->next = tmp;
36
+ tail = tail->next ;
37
+ Q.push (tmp->next );
38
+ }
39
+ return head->next ;
40
+ }
41
+ };
42
+
43
+ -----------------------------------------------------------------------
44
+ /* *
45
+ * Definition for singly-linked list.
46
+ * struct ListNode {
47
+ * int val;
48
+ * ListNode *next;
49
+ * ListNode(int x) : val(x), next(NULL) {}
50
+ * };
51
+ */
52
+ class Solution {
53
+ public:
54
+ ListNode* merge (ListNode*l1,ListNode*l2){ // 将两个链表合并的函数
55
+ if (l1==NULL &&l2!=NULL ) // 如果两个链表有一个为空,那么返回另外一个。如果都为空,返回NULL。
56
+ return l2;
57
+ else if (l1!=NULL &&l2==NULL )
58
+ return l1;
59
+ else if (l1==NULL &&l2==NULL )
60
+ return NULL ;
61
+
62
+ ListNode*ans,*p;
63
+ if (l1->val <=l2->val ){ // 处理首节点
64
+ ans=l1;
65
+ l1=l1->next ;
66
+ }
67
+ else {
68
+ ans=l2;
69
+ l2=l2->next ;
70
+ }
71
+ p=ans;
72
+ while (l1!=NULL &&l2!=NULL ){ // 每次从两个链表中取出一个结点放到结果链表当中
73
+ if (l1->val <=l2->val )
74
+ {
75
+ p->next =l1;
76
+ l1=l1->next ;
77
+ }
78
+ else
79
+ {
80
+ p->next =l2;
81
+ l2=l2->next ;
82
+ }
83
+ p = p->next ;
84
+ }
85
+
86
+
87
+ if (l1!=NULL )p->next =l1;
88
+ if (l2!=NULL )p->next =l2;
89
+
90
+ return ans;
91
+ }
92
+
93
+ ListNode* mergeKLists (vector<ListNode*>& lists) {
94
+ int len = lists.size ();
95
+ if (len == 0 )return NULL ;
96
+
97
+ ListNode *ans = lists[0 ];
98
+ for (int i = 1 ; i < len;i++){
99
+ ans = merge (ans,lists[i]);
100
+ }
101
+
102
+ return ans;
103
+ }
104
+ };
0 commit comments