<p>There is an <strong>undirected</strong> graph consisting of <code>n</code> nodes numbered from <code>1</code> to <code>n</code>. You are given the integer <code>n</code> and a <strong>2D</strong> array <code>edges</code> where <code>edges[i] = [a<sub>i</sub>, b<sub>i</sub>]</code> indicates that there is an edge between nodes <code>a<sub>i</sub></code> and <code>b<sub>i</sub></code>. The graph can be disconnected.</p>

<p>You can add <strong>at most</strong> two additional edges (possibly none) to this graph so that there are no repeated edges and no self-loops.</p>

<p>Return <code>true</code><em> if it is possible to make the degree of each node in the graph even, otherwise return </em><code>false</code><em>.</em></p>

<p>The degree of a node is the number of edges connected to it.</p>

<p>&nbsp;</p>
<p><strong>Example 1:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/10/26/agraphdrawio.png" style="width: 500px; height: 190px;" />
<pre>
<strong>Input:</strong> n = 5, edges = [[1,2],[2,3],[3,4],[4,2],[1,4],[2,5]]
<strong>Output:</strong> true
<strong>Explanation:</strong> The above diagram shows a valid way of adding an edge.
Every node in the resulting graph is connected to an even number of edges.
</pre>

<p><strong>Example 2:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/10/26/aagraphdrawio.png" style="width: 400px; height: 120px;" />
<pre>
<strong>Input:</strong> n = 4, edges = [[1,2],[3,4]]
<strong>Output:</strong> true
<strong>Explanation:</strong> The above diagram shows a valid way of adding two edges.</pre>

<p><strong>Example 3:</strong></p>
<img alt="" src="https://assets.leetcode.com/uploads/2022/10/26/aaagraphdrawio.png" style="width: 150px; height: 158px;" />
<pre>
<strong>Input:</strong> n = 4, edges = [[1,2],[1,3],[1,4]]
<strong>Output:</strong> false
<strong>Explanation:</strong> It is not possible to obtain a valid graph with adding at most 2 edges.</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>3 &lt;= n &lt;= 10<sup>5</sup></code></li>
	<li><code>2 &lt;= edges.length &lt;= 10<sup>5</sup></code></li>
	<li><code>edges[i].length == 2</code></li>
	<li><code>1 &lt;= a<sub>i</sub>, b<sub>i</sub> &lt;= n</code></li>
	<li><code>a<sub>i</sub> != b<sub>i</sub></code></li>
	<li>There are no repeated edges.</li>
</ul>

class Solution:
    def isPossible(self, n: int, edges: List[List[int]]) -> bool:

        edges_set = set()
        for e in edges:
            edges_set.add((e[0], e[1]))
            edges_set.add((e[1], e[0]))

        adj_list = {}
        for e in edges:
            if e[0] in adj_list:
                adj_list[e[0]].append(e[1])
            else:
                adj_list[e[0]] = [e[1]]

            if e[1] in adj_list:
                adj_list[e[1]].append(e[0])
            else:
                adj_list[e[1]] = [e[0]]

        print("adj", adj_list)
        odd_degree_nodes = []
        for k, v in adj_list.items():
            # print(k)
            # print(v)
            if len(v) % 2 != 0:
                odd_degree_nodes.append(k)

        print("odd_degree_nodes", odd_degree_nodes)
        if (
            len(odd_degree_nodes) > 4
            or len(odd_degree_nodes) == 1
            or len(odd_degree_nodes) == 3
        ):
            return False

        if len(odd_degree_nodes) == 0:
            return True

        if len(odd_degree_nodes) == 2:
            if (odd_degree_nodes[0], odd_degree_nodes[1]) in edges_set or (
                odd_degree_nodes[1],
                odd_degree_nodes[0],
            ) in edges_set:
                print("here")
                for node in range(1, n + 1):
                    print("checking node ",node)
                    node_list = adj_list.get(node,[])
                    if (
                        odd_degree_nodes[1] not in node_list
                        and odd_degree_nodes[0] not in node_list
                    ):
                        print("return true")
                        return True
                print("return false")
                return False
            else:
                return True

        if len(odd_degree_nodes) == 4:
            node1 = odd_degree_nodes[0]
            node2 = odd_degree_nodes[1]
            node3 = odd_degree_nodes[2]
            node4 = odd_degree_nodes[3]

            if (
                (node1, node2) not in edges_set and (node2, node1) not in edges_set
            ) and ((node3, node4) not in edges_set and (node4, node3) not in edges_set):
                return True

            if (
                (node1, node3) not in edges_set and (node3, node1) not in edges_set
            ) and ((node2, node4) not in edges_set and (node4, node2) not in edges_set):
                return True

            if (
                (node1, node4) not in edges_set and (node4, node1) not in edges_set
            ) and ((node2, node3) not in edges_set and (node3, node2) not in edges_set):
                return True

        return False

1436